package com.rr.learningdemo.service.impl;

import com.rr.learningdemo.dao.PersonDao;
import com.rr.learningdemo.pojo.Person;
import com.rr.learningdemo.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

/**
 * @author RR
 * @date 2021/5/16 20:03
 */
@Service
public class PersonServiceImpl implements PersonService {

    @Autowired
    private PersonDao personDao;

    /*
    * cacheNames/value：指定缓存组件的名字，可以用数组的方式指定多个
    * key：指定缓存的key，默认是入参，也可以是SpEL表达式：#id吧啦吧啦的
    * keyGenerator：可以配置一个KeyGenerator的bean，自定义key的生成策略
    * cacheManage 指定缓存管理器，或者cacheResolver指定获取解析器
    * condition：指定符合条件的情况下才缓存： #id>0
    * unless：与condition相反
    * sync：是否异步
    * */
    @Cacheable(cacheNames = "person")
    @Override
    public Person selectById(Integer id) {
        System.out.println("查数据库，获取id="+id+"的人");
        return personDao.selectById(id);
    }

    /*
    * 根据名字缓存方法结果
    * 如果同一cacheName和key，两个方法的返回类型不一样，又不能强转，就会报错
    * */
    @CachePut(cacheNames = "person",key="#person.id")
    @Override
    public Person updateById(Person person) {
        System.out.println("更新："+person);
        personDao.updateById(person);
        return person;
    }

    /*
    * 清除对应cacheName和key的缓存
    * a0表示第一个参数
    * allEntries = false/true 指定清除这个缓存中的所有数据
    * beforeInvocation = false/true 默认缓存清除是在方法执行之后，一般就是之后清，万一代码出错了吧啦吧啦的
    * */
    @CacheEvict(cacheNames = "person",key = "#a0")
    @Override
    public boolean deleteById(Integer id) {
        System.out.println("执行删除：id=" + id);
//        personDao.deleteById(id);
        return true;
    }
}
